package com.chenfan.common.extension.mybatisplus.enhanced;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Nonnull;
import javax.annotation.PreDestroy;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * Service服务增强接口
 *
 * @author wulg
 * @date 2021-08-26
 **/
public interface EnhancedService<M extends EnhancedBaseMapper, T> {


    /**
     * 获取
     * @return
     */
    default M getMapper(){
        return (M) EnhancedBeanFactory.getMapper(this);
    }

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     * @return boolean
     */
    default boolean insert(T entity) {
        return EnhancedBeanFactory.getMapper(this).insert(entity) > 0;
    }

    /**
     * 插入多条记录
     *
     * @param list 实体对象集合
     * @return boolean
     */
    default boolean insertBatch(Collection<T> list) {
        return EnhancedBeanFactory.getMapper(this).insertBatch(list) > 0;
    }

    /**
     * 是否存在记录
     *
     * @param queryWrapper
     * @return
     */
    default boolean exist(Wrapper<T> queryWrapper) {
        return EnhancedBeanFactory.getMapper(this).exist(queryWrapper);
    }

    /**
     * 是否不存在记录
     *
     * @param queryWrapper
     * @return
     */
    default boolean notExist(Wrapper<T> queryWrapper) {
        return EnhancedBeanFactory.getMapper(this).notExist(queryWrapper);
    }

    /**
     * insertOrUpdateById
     *
     * @param entity
     * @return
     */
    default int save(T entity) {
        return EnhancedBeanFactory.getMapper(this).save(entity);
    }

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     * @return boolean
     */
    default boolean deleteById(Serializable id) {
        return EnhancedBeanFactory.getMapper(this).deleteById(id) > 0;
    }

    /**
     * 根据 columnMap 条件，删除记录
     *
     * @param columnMap 表字段 map 对象
     * @return boolean
     */
    default boolean deleteByMap(Map<String, Object> columnMap) {
        return EnhancedBeanFactory.getMapper(this).deleteByMap(columnMap) > 0;
    }

    /**
     * 根据 entity 条件，删除记录
     *
     * @param wrapper 实体对象封装操作类（可以为 null）
     * @return boolean
     */
    default boolean delete(Wrapper<T> wrapper) {
        return EnhancedBeanFactory.getMapper(this).delete(wrapper) > 0;
    }

    /**
     * 删除（根据ID 批量删除）
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     * @return boolean
     */
    default boolean deleteBatchIds(Collection<? extends Serializable> idList) {
        return EnhancedBeanFactory.getMapper(this).deleteBatchIds(idList) > 0;
    }

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     * @return boolean
     */
    default boolean updateById(T entity) {
        return EnhancedBeanFactory.getMapper(this).updateById(entity) > 0;
    }

    /**
     * 根据 whereEntity 条件，更新记录
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类（可以为 null,里面的 entity 用于生成 where 语句）
     * @return boolean
     */
    default boolean update(T entity, Wrapper<T> updateWrapper) {
        return EnhancedBeanFactory.getMapper(this).update(entity, updateWrapper) > 0;
    }

    /**
     * 无策略更新
     * @param updateWrapper
     * @return
     */
    default boolean updateByNoStrategy(LambdaUpdateWrapper<T> updateWrapper) {
        return EnhancedBeanFactory.getMapper(this).updateByNoStrategy(updateWrapper);
    }

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     * @return T
     */
    default T selectById(Serializable id) {
        return EnhancedBeanFactory.getMapper(this).selectById(id);
    }

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     * @return List
     */
    default List<T> selectBatchIds(Collection<? extends Serializable> idList) {
        return EnhancedBeanFactory.getMapper(this).selectBatchIds(idList);
    }

    /**
     * 查询（根据 columnMap 条件）
     *
     * @param columnMap 表字段 map 对象
     * @return list
     */
    default List<T> selectByMap(Map<String, Object> columnMap) {
        return EnhancedBeanFactory.getMapper(this).selectByMap(columnMap);
    }

    /**
     * 根据 entity 条件，查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return T
     */
    default T selectOne(Wrapper<T> queryWrapper) {
        return EnhancedBeanFactory.getMapper(this).selectOne(queryWrapper);
    }

    /**
     * 根据 Wrapper 条件，查询总记录数
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return integer
     */
    default Integer selectCount(Wrapper<T> queryWrapper) {
        return EnhancedBeanFactory.getMapper(this).selectCount(queryWrapper);
    }

    /**
     * 根据 entity 条件，查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return list
     */
    default List<T> selectList(Wrapper<T> queryWrapper) {
        return EnhancedBeanFactory.getMapper(this).selectList(queryWrapper);
    }

    /**
     * 根据 entity 条件，查询全部记录（并翻页）
     *
     * @param page         分页查询条件（可以为 RowBounds.DEFAULT）
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return <E extends IPage<T>> E
     */
    default <E extends IPage<T>> E selectPage(E page, Wrapper<T> queryWrapper) {
        return EnhancedBeanFactory.getMapper(this).selectPage(page, queryWrapper);
    }

    /**
     * 通过依赖-自动注册（注：私有不允许重写）
     * @param objectProvider
     */
    @Autowired
    default void initEnhancedBean(@Nonnull ObjectProvider<M> objectProvider)  {
        if(!EnhancedBeanFactory.contains(this)) {
            EnhancedBeanFactory.register(this, objectProvider.getObject());
        }
    }

    /**
     * 通过销毁注解-自动注销（注：私有不允许重写）
     */
    @PreDestroy
    default void destroyEnhancedBean() {
        EnhancedBeanFactory.unregister(this);
    }
}
